import store from '@/store';

/**
 * 获取腾讯地图密钥，如果密钥为空则尝试重新加载系统配置
 * @returns {Promise<string>} 返回腾讯地图密钥
 */
export const getTencentMapKey = async () => {
  // 从vuex获取密钥
  let key = store.getters['config/tencentLbsKey'];
  
  // 如果密钥不存在，尝试重新加载系统配置
  if (!key) {
    console.warn('腾讯地图KEY未配置，尝试重新加载系统配置');
    
    try {
      // 重新加载系统配置
      await store.dispatch('config/fetchSystemConfig');
      
      // 再次尝试获取密钥
      key = store.getters['config/tencentLbsKey'];
      
      if (!key) {
        console.error('重新加载后腾讯地图KEY仍未配置');
        throw new Error('腾讯地图KEY未配置');
      }
    } catch (error) {
      console.error('重新加载系统配置失败:', error);
      throw error;
    }
  }
  
  return key;
};

/**
 * 使用腾讯地图API进行地理编码解析（经纬度转地址）
 * @param {number} latitude 纬度
 * @param {number} longitude 经度
 * @param {Object} options 可选参数 {getPoi: boolean, poiOptions: string}
 * @returns {Promise<Object>} 地址解析结果
 */
export const geocoder = async (latitude, longitude, options = {}) => {
  try {
    // 获取地图密钥
    const key = await getTencentMapKey();
    
    // 构建请求URL
    let url = `https://apis.map.qq.com/ws/geocoder/v1/?location=${latitude},${longitude}&key=${key}`;
    
    // 添加POI选项（如果需要）
    if (options.getPoi) {
      url += '&get_poi=1';
      if (options.poiOptions) {
        url += `&poi_options=${options.poiOptions}`;
      }
    }
    
    // 发送请求
    return new Promise((resolve, reject) => {
      uni.request({
        url,
        success: (res) => {
          if (res.data && res.data.status === 0 && res.data.result) {
            resolve(res.data.result);
          } else {
            reject(new Error('地址解析失败: ' + JSON.stringify(res.data)));
          }
        },
        fail: (err) => {
          reject(new Error('地址解析请求失败: ' + JSON.stringify(err)));
        }
      });
    });
  } catch (error) {
    throw error;
  }
};

/**
 * 使用腾讯地图API进行位置搜索
 * @param {string} keyword 搜索关键词
 * @param {number} latitude 纬度
 * @param {number} longitude 经度
 * @param {number} radius 搜索半径，单位:米，默认5000米
 * @param {number} pageSize 返回条数，默认10条
 * @returns {Promise<Array>} 搜索结果列表
 */
export const searchLocation = async (keyword, latitude, longitude, radius = 5000, pageSize = 10) => {
  try {
    // 获取地图密钥
    const key = await getTencentMapKey();
    
    // 构建请求URL
    const url = `https://apis.map.qq.com/ws/place/v1/search?keyword=${encodeURIComponent(keyword)}&boundary=nearby(${latitude},${longitude},${radius})&key=${key}&page_size=${pageSize}`;
    
    // 发送请求
    return new Promise((resolve, reject) => {
      uni.request({
        url,
        success: (res) => {
          if (res.data && res.data.status === 0 && res.data.data) {
            resolve(res.data.data);
          } else {
            reject(new Error('位置搜索失败: ' + JSON.stringify(res.data)));
          }
        },
        fail: (err) => {
          reject(new Error('位置搜索请求失败: ' + JSON.stringify(err)));
        }
      });
    });
  } catch (error) {
    throw error;
  }
};

/**
 * 计算两点之间的距离（使用Haversine公式）
 * @param {number} lat1 第一点的纬度
 * @param {number} lon1 第一点的经度
 * @param {number} lat2 第二点的纬度
 * @param {number} lon2 第二点的经度
 * @returns {number} 距离（米）
 */
export const calculateDistance = (lat1, lon1, lat2, lon2) => {
  const R = 6371000; // 地球半径（米）
  const dLat = deg2rad(lat2 - lat1);
  const dLon = deg2rad(lon2 - lon1);
  const a =
    Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
    Math.sin(dLon/2) * Math.sin(dLon/2);
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  const distance = R * c; // 距离（米）
  return Math.round(distance);
};

/**
 * 角度转弧度
 * @param {number} deg 角度
 * @returns {number} 弧度
 */
export const deg2rad = (deg) => {
  return deg * (Math.PI/180);
};

/**
 * 格式化距离显示
 * @param {number} distance 距离（米）
 * @returns {string} 格式化后的距离字符串
 */
export const formatDistance = (distance) => {
  return distance < 1000 ?
    `${Math.round(distance)}m` :
    `${(distance / 1000).toFixed(1)}km`;
};

export default {
  getTencentMapKey,
  geocoder,
  searchLocation,
  calculateDistance,
  formatDistance
}; 